
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * FichaMortalidadPacientePresentacion.java
 *
 * Created on 31-ago-2010, 11:35:04
 */

package presentacion.evolucion;

import com.toedter.calendar.IDateEditor;
import hibernate.objeto.DiagnosticoYTriageInternacion;
import hibernate.objeto.EnfermedadYDiagnosticoAmbulatorio;
import hibernate.objeto.Evolucion;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.text.DecimalFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JSpinner;
import javax.swing.JSpinner.DefaultEditor;
import javax.swing.SpinnerDateModel;
import logica.CapaLogica;
import logica.EvolucionLogica;
import logica.ExamenFisicoLogica;
import logica.validacion.CapaValidacion;
import presentacion.CapaPresentacion;
import presentacion.GestionPacientePresentacion;
import presentacion.MenuPrincipal;
import presentacion.acceso.RestriccionAcceso;
import presentacion.utilidad.maquetado.Fuente;
import presentacion.utilidad.maquetado.Icono;
import presentacion.utilidad.maquetado.InformeError;
import presentacion.utilidad.BarMenu;
import presentacion.utilidad.MensajePresentacion;

/**
 *
 * @author Administrador
 */
public class EvolucionPresentacion extends javax.swing.JDialog {

    /** Creates new form EvolucionPresentacion */
    /**
     * Crea el form de EvolucionPresentacion.
     *
     * @param parent
     * @param modal
     * @param unaEnfermedadYDiagnosticoAmbulatorio El objeto EnfermedadYDiagnosticoAmbulatorio
     * asociado a la Evolucion, null si se trata de una práctica de internación.
     * @param unDiagnosticoYTriageInternacion El objeto DiagnosticoYTriageInternacion
     * asociado a la Evolucion, null si se trata de una práctica de ambulatorio.
     * @param unaEvolucion Si es null se trata de una carga, de lo contrario
     * del objeto Evolucion a visualizar
     */
    public EvolucionPresentacion(java.awt.Frame parent, boolean modal,
            EnfermedadYDiagnosticoAmbulatorio unaEnfermedadYDiagnosticoAmbulatorio,
            DiagnosticoYTriageInternacion unDiagnosticoYTriageInternacion,
            Evolucion unaEvolucion) {
        super(parent, modal);

        enfermedadYDiagnosticoAmbulatorio = unaEnfermedadYDiagnosticoAmbulatorio;
        diagnosticoYTriageInternacion = unDiagnosticoYTriageInternacion;
        evolucion = unaEvolucion;

        initComponents();
        personalizarGUI();
        setearEventosQueCapturanTeclaEnterYEscape();
        setSize(CapaPresentacion.getTamañoMaximoJDialog());
        setLocationRelativeTo(null);
    }

    /**
     * Setea datos de la ventana.
     *
     */
    private void personalizarGUI() {
        //Crea la barra de menu
        this.setJMenuBar(BarMenu.createMenuBarEvolucion(this));
        
        panelSignosVitales.add(new DatosSignosVitales());
        panelSignosVitales.revalidate();
        panelSignosVitales.repaint();
        
        if (CapaPresentacion.modoCarga) {
            modoCarga();
        } else if (CapaPresentacion.modoModificacion) {
            modoModificacion();
        } else if (CapaPresentacion.modoVisualizacion) {
            modoVisualizacion();
        }
    }

    /**
     * Setea la ventana en modo carga.
     * 
     */
    private void modoCarga() {
        cargarTratamiento = false;

        horaEvolucion.getModel().setValue(new Date());
        fechaEvolucion.setDate(new Date());

        textoApellidoNombreProfesional.setText("Evoluciona: " +
                MenuPrincipal.usuarioActivo.getPersona().getApellidoPersona() +
                ", " +
                MenuPrincipal.usuarioActivo.getPersona().getNombrePersona());
    }

    /**
     * Setea la ventana en modo modificación.
     *
     */
    private void modoModificacion() {
        exhibirDatosEvolucion();
        exhibirDatosExamenFisico();

        cargarTratamiento = true;

        horaEvolucion.getModel().setValue(new Date());
        fechaEvolucion.setDate(new Date());

        textoApellidoNombreProfesional.setText("Evoluciona: " +
                MenuPrincipal.usuarioActivo.getPersona().getApellidoPersona() +
                ", " +
                MenuPrincipal.usuarioActivo.getPersona().getNombrePersona());
    }
    
    /**
     * Setea la ventana en modo visualización.
     *
     */
    private void modoVisualizacion() {
        exhibirDatosEvolucion();
        exhibirDatosExamenFisico();

        setearEstadoCamposExamenFisico(false);
        setearEstadoCamposEvolucion(false);
        
        cargarTratamiento = true;       
        botonCancelar.requestFocus();
        CapaPresentacion.personalizarBotonesEnVisualizacion(textoDescriptivoVentana,
                botonAceptar, botonCancelar);
    }

    /**
     * Permite visualizar los detalles de la evolución.
     *
     */
    private void exhibirDatosEvolucion() {
        if (GestionPacientePresentacion.esAmbulatorio()) {
            CapaPresentacion.setearLabelEstado(
                enfermedadYDiagnosticoAmbulatorio, textoEstadoEntidad);
        } else {
            CapaPresentacion.setearLabelEstado(
                diagnosticoYTriageInternacion, textoEstadoEntidad);
        }
        
        String horaEnString = evolucion.getHoraEvolucion();
        horaEvolucion.getModel().setValue(new Date(0, 0, 0,
                CapaLogica.separarHoras(horaEnString),
                CapaLogica.separarMinutos(horaEnString),
                CapaLogica.separarSegundos(horaEnString)));
        fechaEvolucion.setDate(evolucion.
                getFechaEvolucion());
        descripcionEvolucion.setText(
                evolucion.getDescripcionEvolucion());
        descripcionEvolucion.setCaretPosition(0);
        textoApellidoNombreProfesional.setText("Evolucionó: " + evolucion.
                getApellidoProfesionalEvolucion() + ", " +
                evolucion.getNombreProfesionalEvolucion());
    }

    /**
     * Permite visualizar los detalles del examen fisico.
     *
     */
    private void exhibirDatosExamenFisico() {
        if (evolucion.getExamenFisico() != null) {
            CapaPresentacion.setearLabelEstado(evolucion, textoEstadoEntidad);

            //Peso y altura
            peso.setValue(
                   evolucion.getExamenFisico().getPesoExamenFisico());

            altura.setValue(
                  evolucion.getExamenFisico().getAlturaExamenFisico());

            if (evolucion.getExamenFisico().getBmiExamenFisico() != -1) {
                bmi.setText(CapaLogica.floatToString(
                        evolucion.getExamenFisico().getBmiExamenFisico()));
            }

            if (evolucion.getExamenFisico().getGradoExamenFisico() != -1) {
                grado.setText(
                        evolucion.getExamenFisico().getGradoExamenFisico().toString());
            }

            if (evolucion.getExamenFisico().getBsaExamenFisico() != -1) {
                bsa.setText(CapaLogica.floatToString(
                        evolucion.getExamenFisico().getBsaExamenFisico()));
            }

            //Perimetros
            perimetroCefalico.setValue(
                    evolucion.getExamenFisico().getPerimetroCefalicoExamenFisico());

            perimetroAbdominal.setValue(
                    evolucion.getExamenFisico().getPerimetroAbdominalExamenFisico());

            ((DatosSignosVitales) panelSignosVitales.getComponent(0)).
                    exhibirDatosSignosVitales(evolucion.getExamenFisico());

            comentariosMedicionesYAlgoritmos.setText(
                    evolucion.getExamenFisico().getComentariosExamenFisico());
            comentariosMedicionesYAlgoritmos.setCaretPosition(0);
        }

        if (((Float) peso.getValue()) == 0 || ((Float) altura.getValue()) == 0) {
            bmi.setText("no calculable");
            grado.setText("no calculable");
            bsa.setText("no calculable");
        }
    }

    /**
     * Pone en false la propiedad enabled de todos los campos de ingreso
     * correspondientes a evolución.
     *
     * @param estado El estado a setear
     */
    private void setearEstadoCamposEvolucion(boolean estado) {
        horaEvolucion.setEnabled(estado);
        fechaEvolucion.setEnabled(estado);
        descripcionEvolucion.setEnabled(estado);
    }

    /**
     * Pone en false la propiedad enabled de todos los campos de ingreso
     * correspondientes a examen físico.
     *
     * @param estado El estado a setear
     */
    private void setearEstadoCamposExamenFisico(boolean estado) {
        peso.setEnabled(estado);
        altura.setEnabled(estado);
        perimetroAbdominal.setEnabled(estado);
        perimetroCefalico.setEnabled(estado);

        ((DatosSignosVitales)
                panelSignosVitales.getComponent(0)).setearEstadoCampos(estado);

        comentariosMedicionesYAlgoritmos.setEnabled(estado);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        textoDescriptivoVentana = new javax.swing.JLabel();
        panelEvolucion = new javax.swing.JPanel();
        textoHoraYFechaEvolucion = new javax.swing.JLabel();
        SpinnerDateModel spinerModel = new SpinnerDateModel(new Date(0, 0, 0, Calendar.HOUR_OF_DAY, 0, 0), null, null, Calendar.HOUR_OF_DAY);
        horaEvolucion = new javax.swing.JSpinner(spinerModel);
        fechaEvolucion = new com.toedter.calendar.JDateChooser();
        textoDescripcionEvolucion = new javax.swing.JLabel();
        descripcionEvolucionScrollPanel = new javax.swing.JScrollPane();
        descripcionEvolucion = new javax.swing.JTextArea();
        textoApellidoNombreProfesional = new javax.swing.JLabel();
        panelExamenFisico = new javax.swing.JPanel();
        panelMedicionesYAlgoritmos = new javax.swing.JPanel();
        bmi = new javax.swing.JLabel();
        textoBMI = new javax.swing.JLabel();
        grado = new javax.swing.JLabel();
        textoGrado = new javax.swing.JLabel();
        textoBSA = new javax.swing.JLabel();
        textoAreaSuperficieCorporal = new javax.swing.JLabel();
        bsa = new javax.swing.JLabel();
        peso = new javax.swing.JSpinner();
        textoAltura = new javax.swing.JLabel();
        altura = new javax.swing.JSpinner();
        textoPeso = new javax.swing.JLabel();
        textoIndiceMasaCorporal = new javax.swing.JLabel();
        separator1 = new javax.swing.JSeparator();
        textoPerimetroCefalico = new javax.swing.JLabel();
        perimetroCefalico = new javax.swing.JSpinner();
        separator2 = new javax.swing.JSeparator();
        textoPerimetroAbdominal = new javax.swing.JLabel();
        perimetroAbdominal = new javax.swing.JSpinner();
        panelSignosVitales = new javax.swing.JPanel();
        panelComentarios = new javax.swing.JPanel();
        scrollPaneComentariosMedicionesYAlgoritmos = new javax.swing.JScrollPane();
        comentariosMedicionesYAlgoritmos = new javax.swing.JTextArea();
        jLabel1 = new javax.swing.JLabel();
        botonTratamientoMedicamentoso = new javax.swing.JButton();
        botonAceptar = new javax.swing.JButton();
        botonCancelar = new javax.swing.JButton();
        textoEstadoEntidad = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Evolución de la Enfermedad");
        setResizable(false);

        textoDescriptivoVentana.setFont(Fuente.FUENTE_TITULO_2);
        textoDescriptivoVentana.setForeground(Fuente.COLOR_NORMAL);
        textoDescriptivoVentana.setText("Ingrese la información de la evolución");
        textoDescriptivoVentana.setPreferredSize(new java.awt.Dimension(762, 20));

        panelEvolucion.setMinimumSize(new java.awt.Dimension(0, 0));

        textoHoraYFechaEvolucion.setFont(Fuente.FUENTE_LABEL);
        textoHoraYFechaEvolucion.setForeground(Fuente.COLOR_NORMAL);
        textoHoraYFechaEvolucion.setText("Hora y fecha");
        textoHoraYFechaEvolucion.setPreferredSize(new java.awt.Dimension(135, 20));

        JSpinner.DateEditor horaDeMuerte = new JSpinner.DateEditor(horaEvolucion, "HH:mm:ss");
        horaEvolucion.setEditor(horaDeMuerte);
        horaEvolucion.setFont(Fuente.FUENTE_TEXTFIELD);
        horaEvolucion.setPreferredSize(new java.awt.Dimension(128, 20));

        fechaEvolucion.setToolTipText("");
        fechaEvolucion.setDate(new Date());
        fechaEvolucion.setMaxSelectableDate(new Date());
        fechaEvolucion.setMinSelectableDate(new java.util.Date(-2208985673000L));
        fechaEvolucion.setPreferredSize(new java.awt.Dimension(144, 20));

        textoDescripcionEvolucion.setFont(Fuente.FUENTE_LABEL);
        textoDescripcionEvolucion.setForeground(Fuente.COLOR_NORMAL);
        textoDescripcionEvolucion.setText("Descripción");
        textoDescripcionEvolucion.setPreferredSize(new java.awt.Dimension(135, 20));

        descripcionEvolucionScrollPanel.setPreferredSize(new java.awt.Dimension(760, 236));

        descripcionEvolucion.setColumns(2);
        descripcionEvolucion.setFont(Fuente.FUENTE_TEXTFIELD);
        descripcionEvolucion.setForeground(Fuente.COLOR_NORMAL);
        descripcionEvolucion.setLineWrap(true);
        descripcionEvolucion.setRows(2);
        descripcionEvolucion.setWrapStyleWord(true);
        descripcionEvolucionScrollPanel.setViewportView(descripcionEvolucion);

        textoApellidoNombreProfesional.setFont(Fuente.FUENTE_LABEL);
        textoApellidoNombreProfesional.setForeground(Fuente.COLOR_NORMAL);
        textoApellidoNombreProfesional.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        textoApellidoNombreProfesional.setText("<Profesional que evoluciona>");
        textoApellidoNombreProfesional.setPreferredSize(new java.awt.Dimension(135, 20));

        javax.swing.GroupLayout panelEvolucionLayout = new javax.swing.GroupLayout(panelEvolucion);
        panelEvolucion.setLayout(panelEvolucionLayout);
        panelEvolucionLayout.setHorizontalGroup(
            panelEvolucionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelEvolucionLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelEvolucionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(descripcionEvolucionScrollPanel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 984, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelEvolucionLayout.createSequentialGroup()
                        .addComponent(textoHoraYFechaEvolucion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(horaEvolucion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(fechaEvolucion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(textoApellidoNombreProfesional, javax.swing.GroupLayout.DEFAULT_SIZE, 557, Short.MAX_VALUE))
                    .addComponent(textoDescripcionEvolucion, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );
        panelEvolucionLayout.setVerticalGroup(
            panelEvolucionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelEvolucionLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelEvolucionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(textoHoraYFechaEvolucion, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(horaEvolucion, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(textoApellidoNombreProfesional, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(fechaEvolucion, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(textoDescripcionEvolucion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(descripcionEvolucionScrollPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 181, Short.MAX_VALUE))
        );

        panelExamenFisico.setMinimumSize(new java.awt.Dimension(697, 0));

        panelMedicionesYAlgoritmos.setBorder(javax.swing.BorderFactory.createTitledBorder("Mediciones y Algoritmos"));
        panelMedicionesYAlgoritmos.setPreferredSize(new java.awt.Dimension(321, 343));

        bmi.setFont(Fuente.FUENTE_LABEL);
        bmi.setForeground(Fuente.COLOR_NORMAL);
        bmi.setPreferredSize(new java.awt.Dimension(70, 20));

        textoBMI.setFont(Fuente.FUENTE_LABEL);
        textoBMI.setForeground(Fuente.COLOR_NORMAL);
        textoBMI.setText("BMI");
        textoBMI.setPreferredSize(new java.awt.Dimension(125, 20));

        grado.setFont(Fuente.FUENTE_LABEL);
        grado.setForeground(Fuente.COLOR_NORMAL);
        grado.setPreferredSize(new java.awt.Dimension(70, 20));

        textoGrado.setFont(Fuente.FUENTE_LABEL);
        textoGrado.setForeground(Fuente.COLOR_NORMAL);
        textoGrado.setText("Grado");
        textoGrado.setPreferredSize(new java.awt.Dimension(125, 20));

        textoBSA.setFont(Fuente.FUENTE_LABEL);
        textoBSA.setForeground(Fuente.COLOR_NORMAL);
        textoBSA.setText("BSA (m2)");
        textoBSA.setPreferredSize(new java.awt.Dimension(125, 20));

        textoAreaSuperficieCorporal.setFont(Fuente.FUENTE_LABEL);
        textoAreaSuperficieCorporal.setForeground(Fuente.COLOR_NORMAL);
        textoAreaSuperficieCorporal.setText("Área de superficie corporal");
        textoAreaSuperficieCorporal.setPreferredSize(new java.awt.Dimension(135, 20));

        bsa.setFont(Fuente.FUENTE_LABEL);
        bsa.setForeground(Fuente.COLOR_NORMAL);
        bsa.setPreferredSize(new java.awt.Dimension(70, 20));

        peso.setFont(Fuente.FUENTE_TEXTFIELD);
        peso.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(0.0f), Float.valueOf(0.0f), Float.valueOf(999.0f), Float.valueOf(1.0f)));
        peso.setPreferredSize(new java.awt.Dimension(70, 20));
        peso.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                pesoStateChanged(evt);
            }
        });

        textoAltura.setFont(Fuente.FUENTE_LABEL);
        textoAltura.setForeground(Fuente.COLOR_NORMAL);
        textoAltura.setText("Altura (cm)");
        textoAltura.setPreferredSize(new java.awt.Dimension(135, 20));

        altura.setFont(Fuente.FUENTE_TEXTFIELD);
        altura.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(0.0f), Float.valueOf(0.0f), Float.valueOf(999.0f), Float.valueOf(1.0f)));
        altura.setPreferredSize(new java.awt.Dimension(70, 20));
        altura.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                alturaStateChanged(evt);
            }
        });

        textoPeso.setFont(Fuente.FUENTE_LABEL);
        textoPeso.setForeground(Fuente.COLOR_NORMAL);
        textoPeso.setText("Peso (kg)");
        textoPeso.setPreferredSize(new java.awt.Dimension(135, 20));

        textoIndiceMasaCorporal.setFont(Fuente.FUENTE_LABEL);
        textoIndiceMasaCorporal.setForeground(Fuente.COLOR_NORMAL);
        textoIndiceMasaCorporal.setText("Índice de masa corporal");
        textoIndiceMasaCorporal.setPreferredSize(new java.awt.Dimension(135, 20));

        separator1.setPreferredSize(new java.awt.Dimension(350, 5));

        textoPerimetroCefalico.setFont(Fuente.FUENTE_LABEL);
        textoPerimetroCefalico.setForeground(Fuente.COLOR_NORMAL);
        textoPerimetroCefalico.setText("Perímetro cefálico (cm)");
        textoPerimetroCefalico.setPreferredSize(new java.awt.Dimension(135, 20));

        perimetroCefalico.setFont(Fuente.FUENTE_TEXTFIELD);
        perimetroCefalico.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(0.0f), Float.valueOf(0.0f), Float.valueOf(999.0f), Float.valueOf(1.0f)));
        perimetroCefalico.setPreferredSize(new java.awt.Dimension(70, 20));

        separator2.setPreferredSize(new java.awt.Dimension(350, 5));

        textoPerimetroAbdominal.setFont(Fuente.FUENTE_LABEL);
        textoPerimetroAbdominal.setForeground(Fuente.COLOR_NORMAL);
        textoPerimetroAbdominal.setText("Perímetro abdominal (cm)");
        textoPerimetroAbdominal.setPreferredSize(new java.awt.Dimension(135, 20));

        perimetroAbdominal.setFont(Fuente.FUENTE_TEXTFIELD);
        perimetroAbdominal.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(0.0f), Float.valueOf(0.0f), Float.valueOf(999.0f), Float.valueOf(1.0f)));
        perimetroAbdominal.setPreferredSize(new java.awt.Dimension(70, 20));

        javax.swing.GroupLayout panelMedicionesYAlgoritmosLayout = new javax.swing.GroupLayout(panelMedicionesYAlgoritmos);
        panelMedicionesYAlgoritmos.setLayout(panelMedicionesYAlgoritmosLayout);
        panelMedicionesYAlgoritmosLayout.setHorizontalGroup(
            panelMedicionesYAlgoritmosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelMedicionesYAlgoritmosLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelMedicionesYAlgoritmosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelMedicionesYAlgoritmosLayout.createSequentialGroup()
                        .addGroup(panelMedicionesYAlgoritmosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(textoPeso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(textoAltura, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 84, Short.MAX_VALUE)
                        .addGroup(panelMedicionesYAlgoritmosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(peso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(altura, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addComponent(textoIndiceMasaCorporal, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(panelMedicionesYAlgoritmosLayout.createSequentialGroup()
                        .addComponent(textoPerimetroCefalico, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 84, Short.MAX_VALUE)
                        .addComponent(perimetroCefalico, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(separator1, javax.swing.GroupLayout.DEFAULT_SIZE, 289, Short.MAX_VALUE)
                    .addComponent(separator2, javax.swing.GroupLayout.DEFAULT_SIZE, 289, Short.MAX_VALUE)
                    .addGroup(panelMedicionesYAlgoritmosLayout.createSequentialGroup()
                        .addComponent(textoPerimetroAbdominal, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 84, Short.MAX_VALUE)
                        .addComponent(perimetroAbdominal, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelMedicionesYAlgoritmosLayout.createSequentialGroup()
                        .addGroup(panelMedicionesYAlgoritmosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(panelMedicionesYAlgoritmosLayout.createSequentialGroup()
                                .addGap(10, 10, 10)
                                .addGroup(panelMedicionesYAlgoritmosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(textoBMI, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(textoGrado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                            .addGroup(panelMedicionesYAlgoritmosLayout.createSequentialGroup()
                                .addGap(10, 10, 10)
                                .addComponent(textoBSA, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addComponent(textoAreaSuperficieCorporal, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 84, Short.MAX_VALUE)
                        .addGroup(panelMedicionesYAlgoritmosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addGroup(panelMedicionesYAlgoritmosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(bmi, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(grado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addComponent(bsa, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
                .addContainerGap())
        );
        panelMedicionesYAlgoritmosLayout.setVerticalGroup(
            panelMedicionesYAlgoritmosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelMedicionesYAlgoritmosLayout.createSequentialGroup()
                .addGroup(panelMedicionesYAlgoritmosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelMedicionesYAlgoritmosLayout.createSequentialGroup()
                        .addComponent(textoPeso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(textoAltura, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(11, 11, 11)
                        .addComponent(textoIndiceMasaCorporal, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelMedicionesYAlgoritmosLayout.createSequentialGroup()
                        .addComponent(peso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(altura, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(panelMedicionesYAlgoritmosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(panelMedicionesYAlgoritmosLayout.createSequentialGroup()
                        .addComponent(textoBMI, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(textoGrado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(textoAreaSuperficieCorporal, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(textoBSA, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelMedicionesYAlgoritmosLayout.createSequentialGroup()
                        .addComponent(bmi, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(grado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(bsa, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(separator1, javax.swing.GroupLayout.PREFERRED_SIZE, 5, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(11, 11, 11)
                .addGroup(panelMedicionesYAlgoritmosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(textoPerimetroCefalico, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(perimetroCefalico, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(separator2, javax.swing.GroupLayout.PREFERRED_SIZE, 5, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(panelMedicionesYAlgoritmosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(textoPerimetroAbdominal, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(perimetroAbdominal, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(16, Short.MAX_VALUE))
        );

        panelSignosVitales.setPreferredSize(new java.awt.Dimension(322, 343));
        panelSignosVitales.setLayout(new javax.swing.BoxLayout(panelSignosVitales, javax.swing.BoxLayout.LINE_AXIS));

        panelComentarios.setBorder(javax.swing.BorderFactory.createTitledBorder("Comentarios"));
        panelComentarios.setPreferredSize(new java.awt.Dimension(321, 343));

        comentariosMedicionesYAlgoritmos.setColumns(20);
        comentariosMedicionesYAlgoritmos.setFont(Fuente.FUENTE_TEXTFIELD);
        comentariosMedicionesYAlgoritmos.setForeground(Fuente.COLOR_NORMAL);
        comentariosMedicionesYAlgoritmos.setLineWrap(true);
        comentariosMedicionesYAlgoritmos.setRows(2);
        comentariosMedicionesYAlgoritmos.setWrapStyleWord(true);
        scrollPaneComentariosMedicionesYAlgoritmos.setViewportView(comentariosMedicionesYAlgoritmos);

        javax.swing.GroupLayout panelComentariosLayout = new javax.swing.GroupLayout(panelComentarios);
        panelComentarios.setLayout(panelComentariosLayout);
        panelComentariosLayout.setHorizontalGroup(
            panelComentariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelComentariosLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(scrollPaneComentariosMedicionesYAlgoritmos, javax.swing.GroupLayout.DEFAULT_SIZE, 289, Short.MAX_VALUE)
                .addContainerGap())
        );
        panelComentariosLayout.setVerticalGroup(
            panelComentariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelComentariosLayout.createSequentialGroup()
                .addComponent(scrollPaneComentariosMedicionesYAlgoritmos, javax.swing.GroupLayout.DEFAULT_SIZE, 305, Short.MAX_VALUE)
                .addContainerGap())
        );

        jLabel1.setFont(Fuente.FUENTE_TITULO_2);
        jLabel1.setForeground(Fuente.COLOR_NORMAL);
        jLabel1.setText("Examen Físico");
        jLabel1.setPreferredSize(new java.awt.Dimension(67, 23));

        javax.swing.GroupLayout panelExamenFisicoLayout = new javax.swing.GroupLayout(panelExamenFisico);
        panelExamenFisico.setLayout(panelExamenFisicoLayout);
        panelExamenFisicoLayout.setHorizontalGroup(
            panelExamenFisicoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelExamenFisicoLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelExamenFisicoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 984, Short.MAX_VALUE)
                    .addGroup(panelExamenFisicoLayout.createSequentialGroup()
                        .addComponent(panelMedicionesYAlgoritmos, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(panelSignosVitales, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(panelComentarios, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addContainerGap())
        );
        panelExamenFisicoLayout.setVerticalGroup(
            panelExamenFisicoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelExamenFisicoLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelExamenFisicoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(panelMedicionesYAlgoritmos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(panelSignosVitales, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(panelComentarios, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        botonTratamientoMedicamentoso.setFont(Fuente.FUENTE_BOTON_EXTERNO);
        botonTratamientoMedicamentoso.setForeground(Fuente.COLOR_NORMAL);
        botonTratamientoMedicamentoso.setText("Tratamiento");
        botonTratamientoMedicamentoso.setToolTipText("Abre la ventana de tratamientos correspondiente a la evolución");
        botonTratamientoMedicamentoso.setPreferredSize(new java.awt.Dimension(175, 23));
        botonTratamientoMedicamentoso.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonTratamientoMedicamentosoActionPerformed(evt);
            }
        });

        botonAceptar.setFont(Fuente.FUENTE_BOTON_EXTERNO);
        botonAceptar.setForeground(Fuente.COLOR_NORMAL);
        botonAceptar.setIcon(Icono.ICONO_16_ACEPTAR);
        botonAceptar.setText("Aceptar");
        botonAceptar.setToolTipText("Agrega la  información de la evolución");
        botonAceptar.setPreferredSize(new java.awt.Dimension(110, 23));
        botonAceptar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAceptarActionPerformed(evt);
            }
        });

        botonCancelar.setFont(Fuente.FUENTE_BOTON_EXTERNO);
        botonCancelar.setForeground(Fuente.COLOR_NORMAL);
        botonCancelar.setIcon(Icono.ICONO_16_CANCELAR);
        botonCancelar.setText("Cancelar");
        botonCancelar.setToolTipText("Cancela la operación");
        botonCancelar.setPreferredSize(new java.awt.Dimension(110, 23));
        botonCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonCancelarActionPerformed(evt);
            }
        });

        textoEstadoEntidad.setFont(Fuente.FUENTE_TEXTFIELD);
        textoEstadoEntidad.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        textoEstadoEntidad.setPreferredSize(new java.awt.Dimension(150, 20));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(panelEvolucion, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(botonTratamientoMedicamentoso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 603, Short.MAX_VALUE)
                        .addComponent(botonAceptar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(botonCancelar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(textoDescriptivoVentana, javax.swing.GroupLayout.DEFAULT_SIZE, 836, Short.MAX_VALUE)
                        .addGap(18, 18, 18)
                        .addComponent(textoEstadoEntidad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(panelExamenFisico, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(textoEstadoEntidad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(textoDescriptivoVentana, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelEvolucion, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelExamenFisico, javax.swing.GroupLayout.PREFERRED_SIZE, 383, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(botonCancelar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonAceptar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonTratamientoMedicamentoso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void botonAceptarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAceptarActionPerformed
        agregarEvolucion();
}//GEN-LAST:event_botonAceptarActionPerformed
    private void botonCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonCancelarActionPerformed
        this.dispose();
}//GEN-LAST:event_botonCancelarActionPerformed

    private void botonTratamientoMedicamentosoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonTratamientoMedicamentosoActionPerformed
        tratamientoMedicamentoso();
    }//GEN-LAST:event_botonTratamientoMedicamentosoActionPerformed

    private void pesoStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_pesoStateChanged
        calcularAlgoritmos();
}//GEN-LAST:event_pesoStateChanged

    private void alturaStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_alturaStateChanged
        calcularAlgoritmos();
}//GEN-LAST:event_alturaStateChanged

    /**
     * Calcula automaticamente el bsa, grado y bmi en caso de tener los datos
     * necesarios
     *
     */
    private void calcularAlgoritmos() {
        float pesoTemporal = Float.valueOf(peso.getValue().toString());
        float alturaTemporal = Float.valueOf(altura.getValue().toString());

        if (pesoTemporal != 0 && alturaTemporal != 0) {
            calcularBmi(pesoTemporal, alturaTemporal);
            calcularBsa(pesoTemporal, alturaTemporal);
        } else {
            bmi.setText("no calculable");
            grado.setText("no calculable");
            bsa.setText("no calculable");
        }
    }

    /**
     * Calcula automaticamente el bmi con los datos ingresados.
     *
     * @param pesoTemporal El peso ingresado
     * @param alturaTemporal La altura ingresada
     */
    private void calcularBmi(float pesoTemporal, float alturaTemporal) {
        //MBI = masa /(estatura * estatura)
        float bmiTemporal = (float)
                (pesoTemporal / Math.pow(alturaTemporal / 100, 2));

        bmi.setText(new DecimalFormat("00.00").format(bmiTemporal));
        calcularGrado(bmiTemporal);
    }

    /**
     * Calcula automaticamente el grado con los datos ingresados.
     *
     * @param bmiTemporal El bmi calculado
     */
    private void calcularGrado(float bmiTemporal) {
        if (bmiTemporal< 25) {
            grado.setText(new Integer(0).toString());
        } else if (bmiTemporal >= 25 && bmiTemporal < 30) {
            grado.setText(new Integer(1).toString());
        } else if (bmiTemporal >= 30 && bmiTemporal < 40) {
            grado.setText(new Integer(2).toString());
        } else if (bmiTemporal >= 40) {
            grado.setText(new Integer(3).toString());
        }
    }

    /**
     * Calcula automaticamente el bsa con los datos ingresados.
     *
     * @param pesoTemporal El peso ingresado
     * @param alturaTemporal La altura ingresada
     */
    private void calcularBsa(float pesoTemporal, float alturaTemporal) {
        //BSA = (peso^0.425 * altura^0.725) * 0.007184
        float bsaTemporal = (float) ((Math.pow(pesoTemporal, 0.425) *
                Math.pow(alturaTemporal, 0.725)) * 0.007184);

        bsa.setText(new DecimalFormat("0.00").format(bsaTemporal));
    }

    /**
     * Agrega la evolución para la enfermedad/internación del paciente.
     *
     */
    private void agregarEvolucion() {
        //Valida todos los datos ingresados
        if (validarCamposEvolucion()) {
            if (CapaPresentacion.confirmarModificacion("evolución", "la")) {
                //Carga toda la información de la pantalla
                recopilarInformacionEvolucion();

                int[] idEvolucion = new int[1];
                if (CapaPresentacion.modoModificacion) {
                    //Modificación de evolucion
                    idEvolucion[0] = evolucion.getIdEvolucion();
                } else {
                    //Alta de evolucion
                    idEvolucion[0] = -1;
                }

                if (enfermedadYDiagnosticoAmbulatorio != null) {
                    if (EvolucionLogica.agregarEvolucionAmbulatorio(
                            datosEvolucion, enfermedadYDiagnosticoAmbulatorio,
                            evolucion, idEvolucion)) {
                        evolucion = EvolucionLogica.getEvolucionPorId(idEvolucion[0]);
                        //Examen fisico
                        if (agregarExamenFisico()) {
                            dispose();
                        }
                    }
                } else if (diagnosticoYTriageInternacion != null) {
                    if (EvolucionLogica.agregarEvolucionInternacion(
                            datosEvolucion, diagnosticoYTriageInternacion,
                            evolucion, idEvolucion)) {
                        evolucion = EvolucionLogica.getEvolucionPorId(idEvolucion[0]);
                        //Examen fisico
                        if (agregarExamenFisico()) {
                            dispose();
                        }
                    }
                }
            }
        } else {
            MensajePresentacion.errorDatosInvalidos();
        }
    }

    /**
     * Valida en conjunto todos los campos correspondientes a evolución.
     * Aquellos que son obligatorios y los que no.
     *
     * @return true si el objeto está listo para cargarse, false en caso
     * contrario
     */
    private boolean validarCamposEvolucion() {
        boolean esFechaValida = false;
        boolean esDescripcionValida = false;

        //Manejo de la validación de fecha
        if (!CapaValidacion.validarFecha(
                fechaEvolucion.getDate(), null, true)) {
            textoHoraYFechaEvolucion.setForeground(
                    Fuente.COLOR_ERROR);
            textoHoraYFechaEvolucion.setToolTipText(InformeError.
                    INFORME_ERROR_USO_COMUN_HORA_Y_FECHA);
            esFechaValida = false;
        } else {
            textoHoraYFechaEvolucion.setForeground(
                    Fuente.COLOR_NORMAL);
            textoHoraYFechaEvolucion.setToolTipText(null);
            esFechaValida = true;
        }

        //Manejo de la descripción de la evolución
        if (!CapaValidacion.validarCampoObligatorio(
                descripcionEvolucion.getText())) {
            textoDescripcionEvolucion.setForeground(
                    Fuente.COLOR_ERROR);
            textoDescripcionEvolucion.setToolTipText(InformeError.
                    INFORME_ERROR_USO_COMUN_EVOLUCION_DESCRIPCION);
            esDescripcionValida = false;
        } else {
            textoDescripcionEvolucion.setForeground(
                    Fuente.COLOR_NORMAL);
            textoDescripcionEvolucion.setToolTipText(null);
            esDescripcionValida = true;
        }

        return esFechaValida && esDescripcionValida;
    }

    /**
     * Carga todos los datos ingresados en pantalla correspondientes a evolución.
     *
     */
    private void recopilarInformacionEvolucion() {
        datosEvolucion = new Object[5];

        datosEvolucion[CapaLogica.EVOLUCION_HORA] =
                CapaLogica.separarTiempo(horaEvolucion.getValue().toString());

        datosEvolucion[CapaLogica.EVOLUCION_FECHA] =
                fechaEvolucion.getDate();

        datosEvolucion[CapaLogica.EVOLUCION_DESCRIPCION] =
                descripcionEvolucion.getText();

        datosEvolucion[CapaLogica.EVOLUCION_APELLIDO_PROFESIONAL] =
                MenuPrincipal.usuarioActivo.getPersona().getApellidoPersona();

        datosEvolucion[CapaLogica.EVOLUCION_NOMBRE_PROFESIONAL] =
                MenuPrincipal.usuarioActivo.getPersona().getNombrePersona();
    }

    /**
     * Agrega el examen fisico para la evolucion de la enfermedad o diagnóstico
     * del paciente.
     *
     * @return true si se agregó correctamente, false en caso contrario
     */
    private boolean agregarExamenFisico() {
        //Carga toda la información de la pantalla
        recopilarInformacionExamenFisico();

        //Si se debe crear
        if (ExamenFisicoLogica.seDebeCrearExamenFisico(datosExamenFisico)) {
            if (ExamenFisicoLogica.agregarExamenFisico(
                    datosExamenFisico, evolucion)) {
                return true;
            } else {
                return false;
            }
        }

        return true;
    }

    /**
     * Carga todos los datos ingresados en pantalla correspondientes a examen
     * físico.
     *
     */
    private void recopilarInformacionExamenFisico() {
        datosExamenFisico = new Object[17];

        datosExamenFisico[
                CapaLogica.EXAMEN_FISICO_PESO] =
                peso.getValue();

        datosExamenFisico[
                CapaLogica.EXAMEN_FISICO_ALTURA] =
                altura.getValue();

        //Por si el evento de los spinner no calculo los algoritmos
        calcularAlgoritmos();

        if (bmi.getText().equals("no calculable")) {
            datosExamenFisico[
                    CapaLogica.EXAMEN_FISICO_BMI] =
                    -1;
        } else {
            datosExamenFisico[
                    CapaLogica.EXAMEN_FISICO_BMI] =
                    bmi.getText().toString();
        }

        if (grado.getText().equals("no calculable")) {
            datosExamenFisico[
                    CapaLogica.EXAMEN_FISICO_GRADO] =
                    -1;
        } else {
            datosExamenFisico[
                    CapaLogica.EXAMEN_FISICO_GRADO] =
                    grado.getText().toString();
        }

        if (bsa.getText().equals("no calculable")) {
            datosExamenFisico[
                    CapaLogica.EXAMEN_FISICO_BSA] =
                    -1;
        } else {
            datosExamenFisico[
                    CapaLogica.EXAMEN_FISICO_BSA] =
                    bsa.getText().toString();
        }

        datosExamenFisico[
                CapaLogica.EXAMEN_FISICO_PERIMETRO_CEFALICO] =
                perimetroCefalico.getValue();

        datosExamenFisico[
                CapaLogica.EXAMEN_FISICO_PERIMETRO_ABDOMINAL] =
                perimetroAbdominal.getValue();

        ((DatosSignosVitales) panelSignosVitales.getComponent(0)).
                recopilarInformacionSignosVitales(datosExamenFisico);

        datosExamenFisico[
                CapaLogica.EXAMEN_FISICO_COMENTARIOS] =
                comentariosMedicionesYAlgoritmos.getText();
    }

    /**
     * Abre la ventana para visualizar/cargar tratamientos medicamentosos.
     *
     */
    public void tratamientoMedicamentoso() {
        if (cargarTratamiento) {
            RestriccionAcceso.TratamientoMedicamentosoPresentacion(
                    null, true, evolucion);
        } else {
            MensajePresentacion.informarEntidadAsociadaNula(
                    "la evolución", "el tratamiento");
        }
    }

    /**
     * Setea en cada componente del JDialog los eventos que capturarán la tecla
     * enter y escape.
     */
    private void setearEventosQueCapturanTeclaEnterYEscape() {
        //Declaración del evento a capturar
        KeyListener keyListenerEnter = new KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
                    //Llamada al método que capturará el boton enter y
                    //trabajará sobre el mismo
                    agregarEvolucion();
                }
            }
        };
        //Declaración del evento a capturar
        KeyListener keyListenerEscape = new KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                if (evt.getKeyCode() == KeyEvent.VK_ESCAPE) {
                    //Llamada al método que capturará el boton enter y
                    //trabajará sobre el mismo
                    dispose();
                }
            }
        };
        //Setear eventos
        ((DefaultEditor) horaEvolucion.getEditor()).
                getTextField().addKeyListener(keyListenerEnter);
        ((DefaultEditor) horaEvolucion.getEditor()).
                getTextField().addKeyListener(keyListenerEscape);

        ((IDateEditor) fechaEvolucion.getDateEditor()).
                getUiComponent().addKeyListener(keyListenerEnter);
        ((IDateEditor) fechaEvolucion.getDateEditor()).
                getUiComponent().addKeyListener(keyListenerEscape);

        descripcionEvolucion.addKeyListener(keyListenerEscape);

        ((DefaultEditor) peso.getEditor()).
                getTextField().addKeyListener(keyListenerEnter);
        ((DefaultEditor) peso.getEditor()).
                getTextField().addKeyListener(keyListenerEscape);
        ((DefaultEditor) altura.getEditor()).
                getTextField().addKeyListener(keyListenerEnter);
        ((DefaultEditor) altura.getEditor()).
                getTextField().addKeyListener(keyListenerEscape);
        ((DefaultEditor) perimetroCefalico.getEditor()).
                getTextField().addKeyListener(keyListenerEnter);
        ((DefaultEditor) perimetroCefalico.getEditor()).
                getTextField().addKeyListener(keyListenerEscape);
        ((DefaultEditor) perimetroAbdominal.getEditor()).
                getTextField().addKeyListener(keyListenerEnter);
        ((DefaultEditor) perimetroAbdominal.getEditor()).
                getTextField().addKeyListener(keyListenerEscape);

        ((DatosSignosVitales) panelSignosVitales.getComponent(0)).
                setearEventosQueCapturanTeclaEnterYEscape(
                keyListenerEnter, keyListenerEscape);

        comentariosMedicionesYAlgoritmos.addKeyListener(keyListenerEscape);

        botonTratamientoMedicamentoso.addKeyListener(keyListenerEscape);
        
        botonAceptar.addKeyListener(keyListenerEscape);
        botonCancelar.addKeyListener(keyListenerEscape);
    }

    /**
     * Retorna la evolución agregada/visualizada.
     *
     * @return El objeto Evolucion
     */
    public static Evolucion getEvolucion() {
        return evolucion;
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JSpinner altura;
    private javax.swing.JLabel bmi;
    private javax.swing.JButton botonAceptar;
    private javax.swing.JButton botonCancelar;
    private javax.swing.JButton botonTratamientoMedicamentoso;
    private javax.swing.JLabel bsa;
    private javax.swing.JTextArea comentariosMedicionesYAlgoritmos;
    private javax.swing.JTextArea descripcionEvolucion;
    private javax.swing.JScrollPane descripcionEvolucionScrollPanel;
    private com.toedter.calendar.JDateChooser fechaEvolucion;
    private javax.swing.JLabel grado;
    private javax.swing.JSpinner horaEvolucion;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel panelComentarios;
    private javax.swing.JPanel panelEvolucion;
    private javax.swing.JPanel panelExamenFisico;
    private javax.swing.JPanel panelMedicionesYAlgoritmos;
    private javax.swing.JPanel panelSignosVitales;
    private javax.swing.JSpinner perimetroAbdominal;
    private javax.swing.JSpinner perimetroCefalico;
    private javax.swing.JSpinner peso;
    private javax.swing.JScrollPane scrollPaneComentariosMedicionesYAlgoritmos;
    private javax.swing.JSeparator separator1;
    private javax.swing.JSeparator separator2;
    private javax.swing.JLabel textoAltura;
    private javax.swing.JLabel textoApellidoNombreProfesional;
    private javax.swing.JLabel textoAreaSuperficieCorporal;
    private javax.swing.JLabel textoBMI;
    private javax.swing.JLabel textoBSA;
    private javax.swing.JLabel textoDescripcionEvolucion;
    private javax.swing.JLabel textoDescriptivoVentana;
    private javax.swing.JLabel textoEstadoEntidad;
    private javax.swing.JLabel textoGrado;
    private javax.swing.JLabel textoHoraYFechaEvolucion;
    private javax.swing.JLabel textoIndiceMasaCorporal;
    private javax.swing.JLabel textoPerimetroAbdominal;
    private javax.swing.JLabel textoPerimetroCefalico;
    private javax.swing.JLabel textoPeso;
    // End of variables declaration//GEN-END:variables
    private EnfermedadYDiagnosticoAmbulatorio enfermedadYDiagnosticoAmbulatorio;
    private DiagnosticoYTriageInternacion diagnosticoYTriageInternacion;
    private static Evolucion evolucion;
    private Object[] datosEvolucion;
    private Object[] datosExamenFisico;
    private boolean cargarTratamiento;
}
